/*
    Università degli Studi di Trento
    Facoltà di Scienze MM.FF.NN.
    Corso di Laurea Triennale in Informatica
    A.A. 2011/2012
    Progetto per il corso di Ingegneria del Software
    Autori:
    Bertoldi Lorenzo 155863
    Cattin Cosso Manuel 146607
    Parrello Nicola 145610
    Meneghini Nicola 145961
    Vinciguerra Stefano 145962
*/

package generatoreCertificati;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.sql.ResultSet;
import java.util.*;

/**
 *
 * @author berto
 */
public class GenerCert {
   /*  
            case 0: corpo=certIscr();break;
            case 1: corpo=certIscrEsami(); break;
            case 2: corpo=certViaggi();break; 
            case 3: corpo=certLaurea();break;
            case 4: corpo=certPartCorso();break;
            case 5: corpo=certIscrIntership();break;
            case 6: corpo=certIscrIntershipEsami();break;
   */ 
    
    public static final int CERT_ISCR=0;
    public static final int CERT_ISCR_ESAMI = 1;
    public static final int CERT_VIAGGI = 2;
    public static final int CERT_LAUREA = 3;
    public static final int CERT_PARTCORSO = 4;
    public static final int CERT_ISCR_INTERNSHIP = 5;
    public static final int CERT_ISCR_INTERNSHIP_ESAMI = 6;
            
    private Font fontTitolo;
    private Font fontNote;
    private Font fontCorpo;
    private Database db;
    
    
    private String id;
    public String tripID;
    public String courseID;
    private String responsabile;
    
    public GenerCert(String id){
        fontTitolo = new Font (Font.FontFamily.TIMES_ROMAN,32,Font.BOLD,BaseColor.BLACK);    
        fontCorpo = new Font (Font.FontFamily.TIMES_ROMAN,12,Font.NORMAL,BaseColor.BLACK);    
        fontNote = new Font (Font.FontFamily.TIMES_ROMAN,10,Font.ITALIC,BaseColor.BLACK);    
        db=new Database();
        this.id=id;
    }
    
    private String ottieniTipoCert(int tipo){
        /*CERT_ISCR=0;
    public static final int CERT_ISCR_ESAMI = 1;
    public static final int CERT_VIAGGI = 2;
    public static final int CERT_LAUREA = 3;
    public static final int CERT_PARTCORSO = 4;
    public static final int CERT_ISCR_INTERNSHIP = 5;
    public static final int CERT_ISCR_INTERNSHIP_ESAMI = 6;*/
       switch(tipo){
           case 0: return "certIscr" ;
           case 1: return "certIscrEsami";
           case 2: return "certViaggi";
           case 3: return "certLaurea";
           case 4: return "certPartCorso";
           case 5: return "certIscrViaggi";
           case 6: return "certIscrViaggiEsami";
           default: return null;
       }
    }
    
    public void generaDocumento(String nomeDocumento,String tipoCertificato, String indirizzo) throws Exception {           
                responsabile="Dr. Mirta Alberti"+"\n"
                +"ICT International Doctoral School\n"
                +"Department of Information Engineering\n"
                +"and Computer Science\n"
                +"University of Trento";
                int tipoCert=Integer.parseInt(tipoCertificato);
                Document document = new Document();
                nomeDocumento=nomeDocumento+"matr"+id+ottieniTipoCert(tipoCert)+".pdf";
                PdfWriter writer=PdfWriter.getInstance(document, new FileOutputStream(nomeDocumento));
                HeaderFooter event = new HeaderFooter(document,indirizzo,tipoCert);
                writer.setPageEvent(event);
                document.open();
                
                componiTitolo(document);
                componiCorpo(document,tipoCert);
                componiBottom(document,tipoCert); //Data e responsabile
                
                event.onEndPage(writer, document);
                
                document.close();               
                writer.close();
    }
    
    public void generaDocumento(ByteArrayOutputStream outPut,String tipoCertificato,String indirizzo) throws Exception {
                ResultSet rs=db.eseguiQuery("SELECT full_name FROM students WHERE user_ID="+id);
                rs.next();
                responsabile="Studente "+rs.getString("full_name");
                int tipoCert=Integer.parseInt(tipoCertificato);
                Document document = new Document();
                PdfWriter writer=PdfWriter.getInstance(document, outPut);
                //writer.setBoxSize("art", new Rectangle(36, 54, 559, 788));
                HeaderFooter event = new HeaderFooter(document,indirizzo,tipoCert);
                writer.setPageEvent(event);
                document.open();
                
                componiTitolo(document);
                componiCorpo(document,tipoCert);
                componiBottom(document,tipoCert); //Data e responsabile
                
                event.onEndPage(writer, document);
                
                document.close();               
                writer.close();
        }
    
    public void generaDocumento(String nomeDocumento,int tipoCert) throws Exception {           
                Document document = new Document();
                PdfWriter writer=PdfWriter.getInstance(document, new FileOutputStream(nomeDocumento));
                //writer.setBoxSize("art", new Rectangle(36, 54, 559, 788));
                String cartInd="";
                HeaderFooter event = new HeaderFooter(document,cartInd,tipoCert);
                writer.setPageEvent(event);
                document.open();
                componiTitolo(document);
                componiCorpo(document,tipoCert);
                componiBottom(document,tipoCert); //Data e responsabile
                
                event.onEndPage(writer, document);
                
                document.close();               
                writer.close();         
        }
    
    public static void main(String args[]){
      GenerCert gd=new GenerCert("1");
      try{
        /*gd.generaDocumento("Iscr.pdf",GenerCert.CERT_ISCR);
        gd.generaDocumento("IscrEsam.pdf",GenerCert.CERT_ISCR_ESAMI);
        gd.generaDocumento("IscrIntership.pdf",GenerCert.CERT_ISCR_INTERNSHIP);
        gd.generaDocumento("IscrInterEsam.pdf",GenerCert.CERT_ISCR_INTERNSHIP_ESAMI);
           */
        gd.generaDocumento("./web/certDaConvalidare/","0","./");
        /*gd.generaDocumento("PartCorso.pdf",GenerCert.CERT_PARTCORSO);
        //gd.generaDocumento("Out0.pdf",GenerCert.CERT_VIAGGI);*/
      }catch(Exception ex){
        System.err.println(ex);
      }
    } 
  
    private void componiCorpo(Document document, int tipocert) throws DocumentException {
        String[] corpo;
        switch (tipocert){
            case 0: corpo=certIscr();break;
            case 1: corpo=certIscrEsami(); break;
            //case 2: corpo=certViaggi();break; 
            case 3: corpo=certLaurea();break;
            case 4: corpo=certPartCorso();break;
            case 5: corpo=certIscrIntership();break;
            case 6: corpo=certIscrIntershipEsami();break;
            
            default:corpo=new String[2] ;
        }                
        //corpo[0]=colSx INGLESE
        //corpo[1]=colDx ITALIANO
        PdfPTable table = new PdfPTable(2);
        table.getDefaultCell().setBorderColor(BaseColor.WHITE);
        table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
        boolean aCapo=false;
        if (tipocert==1 || tipocert==6 || tipocert==5) {   
            aCapo=!aCapo;
            /*
            int i=620;
            if (corpo[0].length()>i) {                               
                while(!((corpo[0].substring(i, i+1)).equals(" "))){
                    i++;
                }
                if(corpo[0].length()>i){
                   aCapo=!aCapo;
                   corpo[2]=corpo[0].substring(i+1, corpo[0].length());
                   corpo[0]=corpo[0].substring(0, i);
                }
            }
            i=620;
            if (corpo[1].length()>i) {
                
                while(!((corpo[1].substring(i, i+1)).equals(" "))){
                    i++;
                }
                if(corpo[1].length()>i){
                   corpo[3]=corpo[1].substring(i+1, corpo[1].length());
                   corpo[1]=corpo[1].substring(0, i);
                }
                
            }
            
            */
        }
            PdfPCell cellSx = new PdfPCell(new Paragraph(corpo[0],fontCorpo));
            PdfPCell cellDx = new PdfPCell(new Paragraph(corpo[1],fontCorpo));
            cellSx.setHorizontalAlignment(PdfPCell.ALIGN_JUSTIFIED);
            cellSx.setBorderColor(BaseColor.WHITE);
            cellSx.setPaddingRight(20);
            cellDx.setHorizontalAlignment(PdfPCell.ALIGN_JUSTIFIED);
            cellDx.setBorderColor(BaseColor.WHITE);
            cellDx.setPaddingLeft(20);
            
            if (aCapo) {           
                table.addCell(cellSx);
                table.addCell(cellDx);
                document.add(table);
                document.newPage();
                
                table = new PdfPTable(2);
                table.getDefaultCell().setBorderColor(BaseColor.WHITE);
                table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
                cellSx=new PdfPCell(new Paragraph(corpo[2],fontCorpo));
                cellDx=new PdfPCell(new Paragraph(corpo[3],fontCorpo));
                cellSx.setHorizontalAlignment(PdfPCell.ALIGN_JUSTIFIED);
                cellSx.setBorderColor(BaseColor.WHITE);
                cellSx.setPaddingRight(20);
                cellDx.setHorizontalAlignment(PdfPCell.ALIGN_JUSTIFIED);
                cellDx.setBorderColor(BaseColor.WHITE);
                cellDx.setPaddingLeft(20);
            }
        
        table.addCell(cellSx);
        table.addCell(cellDx);
        document.add(table);
    }

    private void componiPieDiPagina(Document document) throws BadElementException, MalformedURLException, IOException, DocumentException {
        Phrase firme= new Phrase("\n\n\n\n\n\n     L'addetto al rilascio  "
                + "                                                                   "
                + "L'addetto al Servizio\n");
        document.add(firme);
        //Firma1
        com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance("./images/firmaRilascio.png");
        //Allinemento immagine
        image.setAlignment(Image.LEFT | Image.TEXTWRAP); // Code 2
        //Aggiunge immagine
        document.add(image);
        
        //Firma2
        image = com.itextpdf.text.Image.getInstance("./images/firmaServizio.png");
        //Allinemento immagine
        image.setAlignment(Image.RIGHT | Image.TEXTWRAP); // Code 2
        //Aggiunge immagine
        document.add(image);
        Phrase nota=new Phrase("\n\n\n\n\n\n\n\n\nSi puo' controllare l'autenticita di tale documento tramite il codice presente in alto a destra visitando il sito 'www.unitn.it/phd/controllaValidita'\n\n\n");
        Phrase bottom=new Phrase("\nVia Sommarive, 4 - 38100 Trento (Italia) ~ Tel: +39 123 1234567 ~ Fax: +39 123 1234567 \ne-mail: xxxxx@xxxx.unitn.it");
        document.add(nota);
        document.add(bottom);
    }
    
    
    private String[] certIscr() {
        String[] corpo=new String[4];
        try{  
          ResultSet rs=db.eseguiQuery("SELECT first_name, last_name, "
                  + "place_of_birth, date_of_birth, phd_cycle, "
                  + "phd_scholarship, year_extension_scholarship "
                  + "FROM students s "
                  + "WHERE s.user_ID="+id);
          rs.next();
          String nome=rs.getString("first_name");
          String cognome=rs.getString("last_name");
          String cittaNascita=rs.getString("place_of_birth");
          String dataNascita=rs.getString("date_of_birth");
          String ciclo=rs.getString("phd_cycle");//Numero dell'anno di corso
          String annoIscrizione="2012"; //rs.getString("enrolled_at");
          String borsaDiStudio=rs.getString("phd_scholarship");//Mensile
          String anniProroga=rs.getString("year_extension_scholarship");
          String percentuale="PERCENTUALE";
          //annoIscrizione=annoIscrizione.substring(0, 4);
          //ISCRIZIONE
          corpo[0]="To whom it may concern, \nit is confirmed that the student "
                    +nome + " " + cognome 
                    +", born in "+ cittaNascita +", on " + dataNascita
                    + ", is enrolled in the research doctorate in Information and"
                    +" Communication Technologies as full time student of " 
                    + ciclo + "cycle with administration located at the Università degli Studi di Trento.\n\n" 
                    +"The research doctorate in Information and Communication Technologies "+ ciclo 
                    +" cycle is a three-year program started on 1st November "+annoIscrizione
                    +" that requires obligatory attendance.\n\n"
                    +"The student has been awarded a scholarship of "+ borsaDiStudio
                    + " euros (gross amount) every two months during all the length of the PhD Program";
          if(anniProroga.equals("true")){
            corpo[0]=corpo[0]+" (extension included); it will be increased by the "
                    +percentuale+"% during the internship period";
          }
          corpo[0]=corpo[0]+".";
          //ITALIANO
          corpo[1]="Su richiesta dell'interessato,\nsi conferma che lo studente di dottorato " 
                   + nome+" "+cognome 
                   +", nato a "+ cittaNascita+", il " +dataNascita
                   +", è iscritto al "+ciclo
                   +" ciclo del Corso di Dottorato in Informatica e Telecomunicazioni "
                   +"dell' Università degli Studi di Trento come studente a tempo pieno.\n\n"
                   +"Il " +ciclo+ " ciclo del Corso di Dottorato in Informatica "
                   +"e Telecomunicazioni ha una durata di tre anni a partire dal 1 novembre "
                   +annoIscrizione+" e richiede frequenza obbligatoria.\n\n"
                   +"Allo studente viene erogata una borsa di studio di euro "+borsaDiStudio
                   +" bimestrali lordi, per tutta la durata del Dottorato di ricerca";
          if(anniProroga.equals("true")){
            corpo[1]=corpo[1]+" (compresi eventuali anni di proroga); che verrà aumentato del "+
                    percentuale+"% durante la permanenza all'estero per motivi di ricerca";
          }
          corpo[1]=corpo[1]+".";
        }catch(Exception ex){
          System.err.println(ex);
        }
        return corpo;
    }

    private String[] certEsami(String[] corpo){
      try{
        ResultSet rs=db.eseguiQuery("SELECT first_name, last_name, "
                + "academic_year, is_finished, course_name "
                + "FROM students s, courses_enrollments ce, courses c "
                + "WHERE s.user_ID="+id+" AND ce.student=s.user_ID AND ce.course=c.course_ID "
                + "ORDER BY academic_year");
        
        Collection<String[]> esami=new ArrayList<String[]>();
        String ele[]=new String[2];
        String anno="";
        if (rs.next()){
            String nome=rs.getString("first_name");
        String cognome=rs.getString("last_name");
        String superato;
        corpo[0]=corpo[0]+"\n\n"+nome+" "+cognome+" has passed the following examinations:\n\n";
        
        do{
          ele[0]=rs.getString("academic_year");
          superato=rs.getString("is_finished");
          ele[1]=rs.getString("course_name");
          if((superato!=null)&&(superato.equals("1"))){
            if(!anno.equals(ele[0])){
             corpo[0]=corpo[0]+"\nAcademic year "+ele[0]+"\n\n";
             anno=ele[0];
           }
             corpo[0]=corpo[0]+"  "+ele[1]+"\n\n";
          }
        }while(rs.next());
        
        
       /* Iterator iter=esami.iterator();
        while(iter.hasNext()){
           String[] tmp=(String[])iter.next();
           if(!anno.equals(tmp[0])){
             corpo[0]=corpo[0]+"\nAcademic year "+tmp[0]+"\n\n";
           }
             corpo[0]=corpo[0]+tmp[1]+"\n";
        }*/
        
        }
      }catch(Exception ex){
        System.out.println(ex);
        corpo[0]=corpo[0]+"errore certesami";
        
      }
      return corpo;
    }
    
    private String[] certIscrEsami() {
        String[] corpo=certIscr();
        String[] corpoes=new String[1];
        corpoes[0]="";
        corpo[2]=certEsami(corpoes)[0];
        return corpo;
    }

    private String[] certLaurea() {
      String[] corpo=new String[2];
      try{  
        ResultSet rs=db.eseguiQuery("SELECT first_name, last_name, "
                + "place_of_birth, date_of_birth, is_graduated, graduation_date "
                + "FROM students s "
                  + "WHERE s.user_ID="+id);
        rs.next();
        String nome=rs.getString("first_name");
        String cognome=rs.getString("last_name");
        String cittaNascita=rs.getString("place_of_birth");
        String dataNascita=rs.getString("date_of_birth");
        boolean laureato=rs.getBoolean("is_graduated");
        String dataTesi=rs.getString("graduation_date");
        String titoloTesi="TITOLO TESI";
        
        if(laureato){
          //INGLESE
          corpo[0]="To whom it may concern, \nit is confirmed that "
                +nome+" "+cognome+", born in "+cittaNascita
                +", on "+dataNascita
                +", has successfully finished the research doctorate in Information and "
                +"Communication Technologies located at the Università degli Studi di Trento. Dr. "
                +nome+" "+cognome+" has passed the final examination on "
                +dataTesi+", defending the Thesis \""+titoloTesi+"\".";
          //ITALIANO
          corpo[1]="Su richiesta dell’interessato, \nsi conferma che "
                 +nome+" "+cognome+", nato a "
                 +cittaNascita+", il "+dataNascita
                 +", ha completato con successo il Corso di Dottorato in Informatica e "
                 +"Telecomunicazioni dell’ Università degli Studi di Trento, difendendo il "
                 +dataTesi+" la Tesi: \"" +titoloTesi+"\".";
        }else{
          corpo[0]="You are not a graduated";
          corpo[1]="Tu non sei un laureato";
        }
      }catch(Exception ex){
          corpo[0]="Error while creating the certificate";
          corpo[1]="Errore durante la creazione del certificato";
      }
        return corpo;
    }

    private String[] certPartCorso() {
      String[] corpo=new String[2];
      try{  
        ResultSet rs=db.eseguiQuery("SELECT s.first_name, s.last_name, course_name, "
                + "ce.qualification "/*+", sup.firs_name, sup.last_name*/
                + "FROM students s, courses_enrollments ce, "
                + "courses c,supervisors sup "
                  + "WHERE s.user_ID="+id+" AND ce.student=s.user_ID AND "
                + "ce.enrollment_ID= "+ courseID +" AND ce.course = c.course_ID"/*+"AND c.professor = sup.supervisor_ID*/);
        rs.next();
        String nome=rs.getString("first_name");
        String cognome=rs.getString("last_name");
        String corsoDiLaurea="Information Technology";//Lo compila lo studente
        String nomeDelCorso=rs.getString("course_name");//Nome del corso
        //String nomeProfessore=rs.getString("sup.first_name")+" "+rs.getString("sup.last_name");
        String voto=rs.getString("ce.qualification");
        //INGLESE
        corpo[0]="To whom it may concern, \nit is confirmed that the student"
                +nome+" "+cognome
                +", enrolled in the Master’s degree in "+corsoDiLaurea
                +" has taken the PhD course " +nomeDelCorso
                +" by Prof. Stefano Vinciguerra" /*+nomeProfessore*/
                +", at the International Doctoral School in Information and "
                + "Communication Technology of the University of Trento with grade "
                +voto +" out of 10.";
        //ITALIANO
        corpo[1]="Su richiesta dell’interessato, \nsi attesta che "
                +nome+" "+cognome
                +", studente del corso di laurea magistrale in "+corsoDiLaurea
                +", ha frequentato il corso "+nomeDelCorso
                +" tenuto dal Prof. Stefano Vinciguerra"/*+nomeProfessore*/
                +", presso la Scuola di Dottorato in Informatica e "
                +" Telecomunicazioni dell’ Università degli Studi di Trento con esito"
                +voto+" su 10."
                ;
      }catch(Exception ex){
          corpo[0]="Error while creating the certificate";
          corpo[1]="Errore durante la creazione del certificato";
      }
        return corpo;
    }

    private String[] certIscrIntership() {
      String[] corpo=certIscr();
      
      try{  
        ResultSet rs=db.eseguiQuery("SELECT Planned_destination, "
                + "Planned_start_date, Planned_end_date "
                + "FROM trips t "
                + "WHERE t.trip_ID="+tripID);
        rs.next();
        String luogoRicerca=rs.getString("Planned_destination");//Universita e nazione
        String dataInizio=rs.getString("Planned_start_date");//Tirocinio
        String dataFine=rs.getString("Planned_end_date");//Tirocinio
        //String campoStrano=rs.getString("");
        //String intership=rs.getString("");
        //INGLESE
        corpo[0]=corpo[0]+"\n\nThe ICT Doctoral School (Università degli Studi di Trento) "
                 +"agrees that the student will spend a research period abroad, to"
                 + luogoRicerca+ " from the "
                 + dataInizio+ " to the " 
                 + dataFine +", all the expenses will be covered by "
                 +" the Università degli Studi di Trento.";

        corpo[1]=corpo[1]+"\n\nLa Scuola di Dottorato in Informatica e "
                 +"Telecomunicazioni (Università degli Studi di Trento) "
                 +"approva il periodo di ricerca che lo studente svolgerà all'estero presso "
                 +luogoRicerca+" dal "+ dataInizio +" al " +dataFine
                 +", tutte le spese verranno sostenute dall'Università degli Studi di Trento.";
        //corpo[0]=corpo[0]+"inglese\n";
        //corpo[1]=corpo[1]+"italiano\n";
      }catch(Exception ex){
          System.out.print(ex);
          corpo[0]="Error while creating the certificate";
          corpo[1]="Errore durante la creazione del certificato";
      }
        return corpo;
    }

    private void componiBottom(Document document,int tipoCert) throws DocumentException {
      aggiungiData(document);
      aggiungiResponsabile(document);
    }

    private String[] certIscrIntershipEsami() {
        String[] corpo=certIscrIntership();
        String[] corpoes=new String[1];
        corpoes[0]="";
        corpo[2]=certEsami(corpoes)[0];
        return corpo;
    }
    
    private void aggiungiResponsabile(Document document) throws DocumentException {
        Paragraph notaResp=new Paragraph(responsabile);
        notaResp.setFont(fontNote);
        notaResp.setAlignment(Paragraph.ALIGN_RIGHT);
        document.add(notaResp);
    }

    private void aggiungiData(Document document) {
      try{
        GregorianCalendar cal=new GregorianCalendar();
        int giorno=cal.get(GregorianCalendar.DAY_OF_MONTH);
        int mese=cal.get(GregorianCalendar.MONTH)+1;
        int anno=cal.get(GregorianCalendar.YEAR);
        String data=giorno+"/"+mese+"/"+anno;
        document.add(new Phrase("Trento,\n"+data+"\n"));
      }catch(Exception ex){
        System.err.println(ex);
      }
    }

    private void componiTitolo(Document document) {
        try{
                Paragraph titolo=new Paragraph("CERTIFICATE\n\n",fontTitolo);
                titolo.setAlignment(Paragraph.ALIGN_CENTER);
                document.add(titolo);
        }catch(Exception ex){
          System.err.println(ex);
        }
    }

    
    
}